package guet.imagan.progbuilder;

import java.util.List;

/**
 * 仅包含编译器的构建器类，专门针对编译型语言项目的构建，这是一个抽象类，用户可在此基础上实现适用于特定操作系统的构建器
 */
public abstract class CompileBuilder extends Builder {
	public CompileBuilder(Compiler compiler) {
		super(compiler);
	}

	/**
	 * 在新的窗口以阻塞的方式运行项目，即：只要该窗口没有关闭，该方法就不会返回。
	 * 说明：该方法将根据需要决定是否构建项目，生成目标文件，然后执行程序。
	 *
	 * @param project 待运行的项目
	 * @param args    启动运行时，传入的命令行参数，这个参数将作为main函数或方法的实参传入。
	 * @throws CompilerException    当项目编译失败时
	 * @throws InterpreterException 当项目解释失败时
	 * @throws ExecuteFileException 当运行程序失败时
	 */
	@Override
	public void run(Project project, String... args) throws CompilerException, InterpreterException, ExecuteFileException, Project.ProjectException {
		List<String> compileResult = compiler.compile(project);
		ExecuteFile exeFile = getExecuteFile(compileResult.get(0));
		exeFile.executeWithWindow(args);
	}

	/**
	 * 在后台以非阻塞的方式运行项目，这种方式无法看到运行程序的窗口。这种方式适合命令行程序的测试。
	 *
	 * @param project   待运行的项目
	 * @param inputFile
	 * @param args      启动运行时，传入的命令行参数，这个参数将作为main函数或方法的实参传入。
	 * @return 程序的控制台输出
	 * @throws CompilerException    当项目编译失败时
	 * @throws InterpreterException 当项目解释失败时
	 * @throws ExecuteFileException 当运行程序失败时
	 */
	@Override
	public TextFile run(Project project, TextFile inputFile, String... args) throws CompilerException, InterpreterException, ExecuteFileException, Project.ProjectException {
		List<String> compileResult = compiler.compile(project);
		ExecuteFile exeFile = getExecuteFile(compileResult.get(0));
		return exeFile.executeWithoutWindow(inputFile,args);
	}
}
